﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using Interfaces;

namespace simpel_Server
{
    public class Server : IDisposable
    {
        List<AuktionClientListe> linkListe = new List<AuktionClientListe>();
        object _lock = new object();
        private bool _aktiv = true;
        public Server(int port)
        {
            Console.WriteLine("Server startet på port:" + port);
            StartUpdateCheck();
            TcpListener listener = new TcpListener(IPAddress.Any, port);
            listener.Start();

            while (true)
            {
                Console.WriteLine("Server klar");

                Socket clientSocket = listener.AcceptSocket();

                Console.WriteLine("client accepteret");

                ClientHandler handler = new ClientHandler(clientSocket, this);
                Thread clientTråd = new Thread(handler.RunClient);
                clientTråd.Start();
            }
        }

        private void StartUpdateCheck()
        {
            Thread updatechecker = new Thread(CheckUpdate);
            updatechecker.Start();
        }
        public void TilmeldMeddelse(IAuktion iauktion, ClientHandler clientHandler)
        {
            lock (_lock)
            {
                if (linkListe.Any())
                {
                    bool tilføjet = false;
                    foreach (AuktionClientListe auktionClientListe in linkListe)
                    {
                        if (auktionClientListe.Auktion == iauktion)
                        {
                            auktionClientListe.Add(clientHandler);
                            tilføjet = true;
                            break;
                        }

                    }
                    if (!tilføjet)
                    {
                        linkListe.Add(new AuktionClientListe(iauktion, clientHandler));
                    }

                }
                else
                    linkListe.Add(new AuktionClientListe(iauktion, clientHandler));

            }
        }
        public void CheckUpdate()
        {
            while (_aktiv)
            {
                lock (_lock)
                {
                    foreach (AuktionClientListe auktionClientListe in linkListe)
                    {
                        auktionClientListe.Opdater();
                    }
                    Thread.Sleep(100);
                }
            }

        }


        public void Dispose()
        {
            _aktiv = false;
            linkListe = null;
        }
    }
}
